<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
      /*   
        Object.defineProperty(object, propertyName, descriptor)用于定义对象中属性的状态
            object：将要添加属性的目标对象
            propertyName：对象中将要添加的属性名称
            descriptor：对象格式的参数(对象格式的对于属性的描述符)，详细设置该属性在对象中表现形式
                value定义属性的值 
                writable该属性是否允许被修改，默认为false
                enumerable该属性是否允许被循环查找到，默认为false
                configurable该属性描述是否可删除

                注意：value、writable配置和get、set不能同时定义在同一个属性的配置中，并且get、set依赖于一个外部变量，为变量提供数据支持
                get()取值方法，无参数，有返回值，劫持对象中的取值行为，通过返回值描述该属性的取值
                set()赋值方法，有参数，无返回值，劫持对象中的赋值行为，参数为属性赋值时候传入的新数据


        */
        var user={
            name:"张鸿"
        };
        user.age=40;
        Object.defineProperty(user,"hobby",{
            value:"被隔离",
            writable:false,
            enumerable:false,
            configurable:false
        });
        // user.age=18;
        // user.hobby="看美女";
        // for(var i in user){
        //     console.log(user[i]);
        // }

        // delete 对象.属性名;//删除对象中的属性，返回值是布尔值
        // console.log(delete user.age);
        // console.log(delete user.hobby);

        var info="上海";
        Object.defineProperty(user,"address",{
            enumerable:false,
            configurable:false,

            //get、set对数据进行拦截(数据劫持)
            get(){//获取对象中的address属性的时候，就会触发get方法
                console.log("get方法被触发了....");
                return info;
            },
            set(val){//设置对象中的address属性的时候，就会触发set方法
                console.log("set方法被触发了....",val);
                info=val;
            }
        });
        user.address="青岛";

        console.log(user.address);
    </script>
</head>
<body>
    
</body>
</html>